【剑指Offer I】45. 把数组排成最小的数
题目
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
输入: [10,2]
输出: "102"
解答
可以认为在拼接时,每个数字都有一个权重,把权重小的放在前面会使得拼接结果更小。那么实质上就是一个排序问题。关键在于如何确定这个权重,或者说如何确定排序规则。
两个数
x
、y
,若xy < yx
,那么x
的权重更小,在最后的结果中应该放在y
的前面;如
xy < yx, yz < zy
,容易证明有xz < xz
,也即传递性。
实现
使用标准库的 sort
函数,自定义匿名比较函数。
其中排序规则,可以根据数值大小比较也可以根据字符串字典序比较。
或者最好自己实现快排。
注意在比较大小时,计算数值比较麻烦,也可以直接转换为字符串然后比较字典序。
代码
1 | class Solution { |
复杂度
- 时间复杂度
O(NlogN)
:stl sort 使用快排的平均时间复杂度 - 空间复杂度
O(1)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 namespace LANG!
评论